package com.twb.core.security.service;

import java.util.List;
import java.util.Set;

import com.twb.core.base.entity.BaseLoginUser;
import com.twb.core.security.jwt.Subject;

/**
 * @Title  ITokenService.java 
 * @Description 令牌管理器
 */
public interface ITokenService {

    /**
     * @Title createToken
     * @Class ITokenService.java
     * @Package com.tw.base.service
     * @Description 生成安全令牌
     * 
     * @param t 传入对象
     * @param subject 关键信息，可通过token解密获取
     * @param appId app前端系统id
     * @param appToken app前端系统接入私钥
     * @param appSecret app前端系统接入密钥
     * @param timeoutSeconds token有效时长,单位秒
     * 
     * @return
     * 
     * @throws Exception
     * @author DSY
     * @date 2017年3月24日 上午11:05:26
     */
    <T extends BaseLoginUser> String createToken(T t,Subject subject,String appId,String appToken,String appSecret) throws Exception;

    /**
     * @Title checkToken
     * @Class ITokenService.java
     * @Package com.tw.base.service
     * @Description 检查安全令牌token的有效性
     * 
     * @param jwtToken 安全令牌
     * @param appToken app前端系统接入私钥
     * @param appSecret app前端系统接入密钥
     * @param timeoutSeconds token有效时长,单位秒
     * 
     * @return
     * 
     * @throws Exception
     * @author DSY
     * @date 2017年3月24日 上午11:06:55
     */
    boolean checkToken(String jwtToken,String appToken,String appSecret) throws Exception;
    /**
     * @Title  refreshToken
     * @Class: ITokenService.java
     * @Description 刷新token有效时间
     * @param jwtToken
     * @param timeoutSeconds
     * @return
     * @throws Exception
     * @author DSY
     * @date 2018年11月3日 下午9:18:59
     */
    Boolean refreshToken(String jwtToken,Long timeoutSeconds) throws Exception;
    
    
    
    /**
     * @Title  getLoginUser
     * @Class: ITokenService.java
     * @Description 获取当前登录用户信息
     * @param token
     * @return
     * @author DSY
     * @date 2018年11月3日 下午8:15:04
     */
    <T extends BaseLoginUser> T getLoginUser(String token);
    
    /**
     * @Title  removeLoginUser
     * @Class: ITokenService.java
     * @Description 移除用户会话
     * @param token
     * @return
     * @author DSY
     * @date 2020年1月22日 下午2:02:36
     */
    boolean removeLoginUser(String token);
    
    /**
     * @Title refreshLoginUser
     * @Description 刷新登录用户缓存信息
     * @param user
     * @param token
     * @param subject
     * @return
     * @author DSY
     * @date 2020年11月9日 下午4:26:06
     */
    <T extends BaseLoginUser> boolean refreshLoginUser(T user,String token,Subject subject);
    
    /**
     * @Title getLoginUserDataScopeCache
     * @Description 获取登录用户数据权限缓存
     * @param token
     * @return
     * @AuthorOriginally DSY
     * @date 2022年7月26日 上午9:18:36
     */
    Set<String> getLoginUserDataScopeCache(String token);
    
    /**
	 * @Title searchOnlineLoginUser
	 * @Description 查询在线用户信息
	 * @return
	 * @AuthorOriginally DSY
	 * @date 2022年7月26日 下午8:56:39
	 */
	List<BaseLoginUser> searchOnlineLoginUser(int pageNum,int pageSize);
	
	/**
	 * @Title countOnlineLoginUser
	 * @Description 查询在线用户数量
	 * @return
	 * @AuthorOriginally DSY
	 * @date 2022年11月1日 下午8:57:00
	 */
	Long countOnlineLoginUser();

	/**
	 * @Title getTwbLoginUser
	 * @Description 获取登录用户详情
	 * @param token
	 * @return
	 * @AuthorOriginally DSY
	 * @date 2022年7月26日 下午9:33:01
	 */
	<T extends BaseLoginUser> T getTwbLoginUser(String token);
	
	/**
     * @Title lockLoginUser
     * @Description 根据账号锁定用户信息
     * @param loginName 用户名
     * @param timeout 锁定时间
     * @param maxCount 最大登录次数
     * @return
     * @AuthorOriginally 杜顺亚
     * @date 2022年10月28日 下午6:35:41
     */
    boolean lockLoginUser(String loginName,long timeout,int maxCount);
    
    /**
     * @Title unlockLoginUser
     * @Description 解锁账户信息
     * @param loginName
     * @return
     * @AuthorOriginally 杜顺亚
     * @date 2022年10月28日 下午6:36:49
     */
    boolean unlockLoginUser(String loginName);

	/**
	 * @Title checklockLoginUser
	 * @Description 检查账号是否被锁
	 * @param loginName
	 * @param maxCount
	 * @return
	 * @AuthorOriginally 杜顺亚
	 * @date 2022年10月28日 下午7:19:58
	 */
	boolean checklockLoginUser(String loginName,int maxCount);
}
